#include "Plan.h"

Plan::Plan(double a1, double b1, double c1, double d1) : d(d1), normale(a1,b1,c1){
	normale.normaliser();
	a=normale.getX();
	b=normale.getY();
	c=normale.getZ();
	boite.setUsed(false);
}

Plan::Plan(Vecteur &n, double d1) : d(d1), normale(n){
	normale.normaliser();
	a=normale.getX();
	b=normale.getY();
	c=normale.getZ();
	boite.setUsed(false);
}

void Plan::intersection(const Rayon &r, Intersection & intersectRetour) {
	Vecteur directionRayon = r.getDirection();
	double vd = normale.prodScal(directionRayon);
	if (vd==0) {
		intersectRetour.setNull(true);
		return;
	}
	Point origineRayon = r.getOrigine();
	double t = -(a*origineRayon.getX() + b*origineRayon.getY() + c*origineRayon.getZ() + d)/vd;
	if(t>0.0 && vd<0.0){
		//Point intersection
		Point m = Point(origineRayon.getX()+directionRayon.getX()*t, origineRayon.getY()+directionRayon.getY()*t, origineRayon.getZ()+directionRayon.getZ()*t);
		intersectRetour.setPoint(m);
		intersectRetour.setDistance(t);
		intersectRetour.setNormale(normale);
		intersectRetour.setObjet(this);
		intersectRetour.setNull(false);
		return;
	}
	intersectRetour.setNull(true);

}
void Plan::intersectionBiface(const Rayon &r, Intersection & intersectRetour) {
	Vecteur directionRayon = r.getDirection();
	double vd = normale.prodScal(directionRayon);
	if (vd==0) {
		intersectRetour.setNull(true);
		return;
	}
	Point origineRayon = r.getOrigine();
	double t = -(a*origineRayon.getX() + b*origineRayon.getY() + c*origineRayon.getZ() + d)/vd;
	Vecteur n = normale;
	if (vd>=0.0) {
		n *= -1;
	}
	if(t>0.0){
		//Point intersection
		Point m = Point(origineRayon.getX()+directionRayon.getX()*t, origineRayon.getY()+directionRayon.getY()*t, origineRayon.getZ()+directionRayon.getZ()*t);
		intersectRetour.setPoint(m);
		intersectRetour.setDistance(t);
		intersectRetour.setNormale(n);
		intersectRetour.setObjet(this);
		intersectRetour.setNull(false);
		return;
	}
	intersectRetour.setNull(true);
}
bool Plan::ombre(const Rayon &r, double distance) {
	Vecteur directionRayon = r.getDirection();
	double vd = normale.prodScal(directionRayon);
	if (vd==0) {
		return false;
	}
	Point origineRayon = r.getOrigine();
	double t = -(a*origineRayon.getX() + b*origineRayon.getY() + c*origineRayon.getZ() + d)/vd;
	if(t>0.0 && t < distance){
		return true;
	}
	return false;
}
